266. Promtail 擷取docker log

WHY

之前是用filebeat將log丟到EFK裡面244. 在GCE使用filebeat傳到GKE的ECK
最近有些案子開始改用loki了,
所以GCE這邊也要跟著改一下。

Solution

專案越來越多,
也開始思考要不要那麼多grafana了。
所以loki統一丟到同一台上面,
雖然說Loki對於全文檢索不太適合,
但如果是針對時間戳記的話是還蠻好用的。

Docker-compose.yaml

version: '3.8'

services:
  promtail:
    image: grafana/promtail:3.2.1
    container_name: promtail
    command: --config.file=/mnt/config/promtail-config.yaml
    volumes:
      - ./promtail.yaml:/mnt/config/promtail-config.yaml
      - /var/lib/docker/containers:/var/lib/docker/containers
    networks:
      - zlm_network


networks:
  zlm_network:
    driver: bridge
    name: zlm_network

簡單掛載promtail,雖然官方文章也有提到使用docker driver
但有點懶得再弄其他套了。

promtail.yaml

server:
  http_listen_port: 9080
  grpc_listen_port: 0

clients:
- url: http://10.60.16.12:3100/loki/api/v1/push

positions:
  filename: /tmp/positions.yaml
target_config:
  sync_period: 10s
scrape_configs:
  - job_name: container_scrape # Job Name
    pipeline_stages:
        - docker: {}
        - static_labels: 
            project: "gr-video-qa"  
    docker_sd_configs: # 使用 Docker Service Discovery
      - host: unix:///var/run/docker.sock # Docker Socket 的位置
        refresh_interval: 5s # 每 5 秒重新掃描一次 Docker Socket
    relabel_configs: # 將 Docker 相關的資訊轉換成 Label
      - source_labels: ['__meta_docker_container_name'] # 將 __meta_docker_container_name 轉為新的名為 container 的 Label
        regex: '/(.*)' # 使用正規表達式取出 Container Name
        target_label: 'container'
      - source_labels: ['__meta_docker_container_log_stream'] # 將 __meta_docker_container_log_stream 轉為新的名為 logstream 的 Label
        target_label: 'logstream'        

promtail的設定檔,

其他部分,參考Promtail — Loki 御用 Log 收集器